<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="u48676ed8" id="u48676ed8"><strong><span data-lake-id="u224f6f9a" id="u224f6f9a">​</span></strong><br></p>
  <p data-lake-id="udd41b581" id="udd41b581"><strong><span data-lake-id="u82b9efb6" id="u82b9efb6">YoungGC的触发条件比较简单，那就是</span></strong><strong><span data-lake-id="u8284f4df" id="u8284f4df" style="color: rgb(18, 18, 18)">当年轻代中的eden区分配满的时候就会触发。</span></strong></p>
  <p data-lake-id="u2adb6be0" id="u2adb6be0"><span data-lake-id="ud2dbe28c" id="ud2dbe28c" style="color: rgb(18, 18, 18)">​</span><br></p>
  <p data-lake-id="u72ea8450" id="u72ea8450"><strong><span data-lake-id="u378991a7" id="u378991a7" style="color: rgb(18, 18, 18)">FullGC的触发条件</span></strong><span data-lake-id="u8c9bb597" id="u8c9bb597" style="color: rgb(18, 18, 18)">比较复杂也比较多，主要以下几种：</span></p>
  <p data-lake-id="uaa13a502" id="uaa13a502"><span data-lake-id="u31f09949" id="u31f09949" style="color: rgb(18, 18, 18)">​</span><br></p>
  <ul list="u2d7d0957">
   <li fid="u232528bb" data-lake-id="u67659702" id="u67659702"><strong><span data-lake-id="ub6644e77" id="ub6644e77" style="color: rgb(18, 18, 18)">老年代空间不足</span></strong></li>
  </ul>
  <ul list="u2d7d0957" data-lake-indent="1">
   <li fid="u232528bb" data-lake-id="ud66acb3f" id="ud66acb3f"><span data-lake-id="u9b195355" id="u9b195355">创建一个大对象，超过指定阈值会直接保存在老年代当中，如果老年代空间也不足，会触发Full GC。</span></li>
   <li fid="u232528bb" data-lake-id="uebfba94c" id="uebfba94c"><span data-lake-id="u7e6b00ed" id="u7e6b00ed">YoungGC之后，发现要移到老年代的对象，老年代存不下的时候，会触发一次FullGC</span></li>
  </ul>
  <ul list="u2d7d0957" start="2">
   <li fid="u232528bb" data-lake-id="u4b331c64" id="u4b331c64"><strong><span data-lake-id="ua79a85a2" id="ua79a85a2">空间分配担保失败</span></strong><span data-lake-id="ube28bbe5" id="ube28bbe5">(空间分配担保详见:</span><a href="https://www.yuque.com/hollis666/vhr2ge/eigm8iqgpwmd2eg8#l3Gjz" data-lake-id="ua1d72ae9" id="ua1d72ae9"><span data-lake-id="u89f8990b" id="u89f8990b">https://www.yuque.com/hollis666/vhr2ge/eigm8iqgpwmd2eg8#l3Gjz</span></a><span data-lake-id="udfb657f8" id="udfb657f8">)</span></li>
  </ul>
  <p data-lake-id="u5ad386fa" id="u5ad386fa"><br></p>
  <ul list="u2d7d0957" data-lake-indent="1">
   <li fid="u232528bb" data-lake-id="u0f15a2d9" id="u0f15a2d9"><span data-lake-id="u1c2905b7" id="u1c2905b7">当准备要触发一次YoungGC时，会进行空间分配担保，在担保过程中，发现</span><strong><span data-lake-id="ue0281d75" id="ue0281d75">虚拟机会检查老年代最大可用的连续空间小于新生代所有对象的总空间，但是HandlePromotionFailure=false</span></strong><span data-lake-id="u02f241ed" id="u02f241ed">，那么就会触发一次FullGC（HandlePromotionFailure 这个配置，在JDK 7中并不在支持了，这一步骤在该版本已取消）</span></li>
   <li fid="u232528bb" data-lake-id="u0dbc48d0" id="u0dbc48d0"><span data-lake-id="u6ffb44ba" id="u6ffb44ba">当准备要触发一次YoungGC时，会进行空间分配担保，在担保过程中，发现</span><strong><span data-lake-id="ue3aa5b29" id="ue3aa5b29">虚拟机会检查老年代最大可用的连续空间小于新生代所有对象的总空间，但是</span></strong><span data-lake-id="u2338e9be" id="u2338e9be">HandlePromotionFailure=true，继续检查发现</span><strong><span data-lake-id="u68cc6dd1" id="u68cc6dd1">老年代最大可用连续空间小于历次晋升到老年代的对象的平均大小时</span></strong><span data-lake-id="u171cb230" id="u171cb230">，会触发一次FullGC</span></li>
  </ul>
  <ul list="u2d7d0957" start="3">
   <li fid="u232528bb" data-lake-id="uc3c00a32" id="uc3c00a32"><strong><span data-lake-id="u031e977c" id="u031e977c" style="color: rgb(18, 18, 18)">永久代空间不足</span></strong></li>
  </ul>
  <ul list="u2d7d0957" data-lake-indent="1">
   <li fid="u232528bb" data-lake-id="u19fee44f" id="u19fee44f"><span data-lake-id="ub77e6119" id="ub77e6119">如果有永久代的话，当在永久代分配空间时没有足够空间的时候，会触发FullGC</span></li>
  </ul>
  <ul list="u2d7d0957" start="4">
   <li fid="u232528bb" data-lake-id="ue6cbaaef" id="ue6cbaaef"><strong><span data-lake-id="u737de29f" id="u737de29f">代码中执行System.gc()</span></strong></li>
  </ul>
  <ul list="ue4ad2e05" data-lake-indent="1">
   <li fid="u1fe63c6e" data-lake-id="uade8f57b" id="uade8f57b"><span data-lake-id="uf7f35b75" id="uf7f35b75">代码中执行System.gc()的时候，会触发FullGC，但是并不保证一定会立即触发。</span></li>
  </ul>
 </body>
</html>